
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>2、SpringAI 核心能力实战 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>2、SpringAI 核心能力实战 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">SpringAI的核心接口是什么？它提供了哪些主要的调用方法以与LLM交互？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SpringAI的核心接口是`ChatClient`。它提供了多种重载的`call`方法，可以接收字符串、结构化的`Prompt`对象或`List<Message>`作为输入，此外还提供了一个`stream`方法用于处理流式响应。</div>
          </div>
          <div class="card-source">来源: 1. LLM 模型调用实战 - ChatClient 接口使用详解</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在SpringAI中，如何调整模型的生成行为，例如创造性或回答长度？请说明用于此目的的类和至少三个关键参数。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过`ChatOptions`类来调整模型行为。关键参数包括：<br>1. `Temperature` (温度): 较低值使输出更确定，较高值更具创意。<br>2. `TopP` (核心采样): 调整令牌选择的范围。<br>3. `MaxTokens` (最大令牌数): 限制响应的长度。<br>4. `Presence/Frequency Penalty`: 控制新主题的引入和词语的重复。</div>
          </div>
          <div class="card-source">来源: 1. LLM 模型调用实战 - 常用模型参数优化技巧</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">SpringAI中默认的调用方式是什么？如果需要提高并发处理能力，可以采用哪种调用方式，并通常如何实现？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SpringAI的默认调用方式是同步调用，它会阻塞直到收到完整响应。为提高性能，可以采用异步调用。文档中的实现方式是使用`CompletableFuture.supplyAsync`结合一个自定义的`AsyncTaskExecutor`（线程池）来包装对`chatClient.call()`的调用。</div>
          </div>
          <div class="card-source">来源: 1. LLM 模型调用实战 - 同步与异步调用实现方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">文档中描述的“动态提示链”（Prompt Chain）是如何工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“动态提示链”是一种多阶段的提示处理模式，其中一个LLM调用的输出结果被用作下一个LLM调用的输入。例如，第一步分析项目需求，第二步基于分析结果推荐技术栈，第三步再结合前两步的输出生成最终的项目计划。</div>
          </div>
          <div class="card-source">来源: 2. 提示工程应用 - 变量注入与动态提示实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">SpringAI中的`PromptTemplate`类有什么作用？除了在代码中硬编码，文档还推荐了哪种更优的模板管理策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`PromptTemplate`类用于标准化和复用提示。文档推荐的更优策略是集中式管理，即将所有提示模板作为文本文件存储在资源文件夹（如 `/resources/prompts/`）中，并通过服务（如`PromptTemplateManager`）在应用启动时加载和注册这些模板。</div>
          </div>
          <div class="card-source">来源: 2. 提示工程应用 - 提示模板设计与管理方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在实现多轮对话时，SpringAI如何维护对话的上下文？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过为每个会话（Session）维护一个`List<Message>`列表来管理上下文。每次用户发送新消息时，将该用户的`UserMessage`添加到列表中，然后将整个包含历史消息的列表构建成一个`Prompt`对象传递给模型。模型返回的`AiMessage`也会被添加到列表中，以保持上下文的连续性。</div>
          </div>
          <div class="card-source">来源: 2. 提示工程应用 - 多轮对话上下文处理技术</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是文本向量化？在SpringAI中，哪个核心接口负责此功能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文本向量化是将文本内容转换为数值向量（Embedding）的过程，这个向量可以被计算机理解和处理。在SpringAI中，负责此功能的核心接口是`EmbeddingClient`。</div>
          </div>
          <div class="card-source">来源: 3. 向量存储与检索 - 文本向量化实现方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当处理长文档时，为了提升向量表示的质量，文档提出了什么策略来增强文本块的上下文信息？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档提出的策略是在向量化之前，将文档的元数据（如标题、作者、类别等）与文本块内容结合起来。通过将这些元数据作为上下文前缀添加到原始文本中，可以生成包含更丰富信息的向量表示。</div>
          </div>
          <div class="card-source">来源: 3. 向量存储与检索 - 文本向量化实现方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">SpringAI支持与多种向量数据库集成，请根据文档内容列举出至少三种不同的向量数据库。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">根据文档内容，SpringAI支持的向量数据库包括：<br>1. Redis<br>2. PostgreSQL (通过 pgvector 扩展)<br>3. Chroma<br>4. Milvus</div>
          </div>
          <div class="card-source">来源: 3. 向量存储与检索 - 不同向量数据库选择与配置</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
